import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 高级配色方案（莫兰迪色系）
COLOR_PALETTE = ['#D4A373', '#A4B494']  # 陶土棕 & 灰绿色
TITLE_FONT = {'fontsize': 14, 'fontweight': 'semibold', 'color': '#2F4F4F'}
LABEL_FONT = {'fontsize': 10, 'fontweight': 'medium', 'color': '#696969'}


def load_and_preprocess():
    """数据加载与预处理"""
    try:
        df = pd.read_excel('clear_maded_food.xlsx', sheet_name='预制表格')
        # 统一数据格式：统一中文/英文大小写
        df['buy'] = df['buy'].str.replace('yes', '是').replace('no', '否').str.strip()
        return df['buy'].value_counts().reindex(['是', '否'], fill_value=0)
    except Exception as e:
        print(f"数据加载失败: {str(e)}")
        exit()


def configure_chinese_font():
    """配置中文字体支持"""
    rcParams['font.sans-serif'] = ['SimHei']  # 微软雅黑可用'Microsoft YaHei'
    rcParams['axes.unicode_minus'] = False


def create_pie_chart(data):
    """创建高级饼图"""
    # 创建画布
    fig, ax = plt.subplots(figsize=(8, 6), facecolor='#F5F5F5')

    # 计算总数用于显示实际人数
    total = data.sum()

    # 绘制饼图参数（添加自定义格式）
    wedges, texts, autotexts = ax.pie(
        data,
        labels=None,  # 移除原始标签
        colors=COLOR_PALETTE,
        autopct=lambda p: f'{p:.1f}%\n({int(round(p * total / 100))})',  # 同时显示百分比和人数
        startangle=90,
        wedgeprops={'linewidth': 1.5, 'edgecolor': 'white'},
        textprops={'fontsize': 10, 'color': 'white', 'fontweight': 'bold'},
        pctdistance=0.8
    )

    # 添加图例说明
    ax.legend(
        wedges,
        data.index,
        title="购买情况",
        loc='center right',
        bbox_to_anchor=(1.1, 0.2),  # 调整图例位置到右下角
        frameon=False,
        fontsize=9
    )

    # 添加中心装饰圆
    centre_circle = plt.Circle((0, 0), 0.6, color='white')
    ax.add_artist(centre_circle)

    # 添加标题和注释
    ax.set_title("预制菜购买行为分析\n", pad=20, **TITLE_FONT)
    plt.text(-1.2, -1.2, '数据来源：调研问卷',
             fontsize=8, color='#808080', alpha=0.7)

    # 调整布局并保存
    plt.tight_layout()
    plt.savefig('purchase_analysis.png', dpi=300, bbox_inches='tight')
    plt.show()


if __name__ == "__main__":
    # 配置环境
    configure_chinese_font()

    # 数据管道
    buy_data = load_and_preprocess()

    # 可视化输出
    create_pie_chart(buy_data)